package ar.com.gals.controller;

import java.util.Arrays;
import java.util.List;

import javax.validation.Valid;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import ar.com.gals.constants.Page;
import ar.com.gals.domain.TipoEquivalencia;
import ar.com.gals.error.GalsException;
import ar.com.gals.model.BuscadorTipoEquivalenciaModel;
import ar.com.gals.model.TipoEquivalenciaModel;

@Controller
@RequestMapping(value = "/Edicion/Equivalencia")
public class TipoEquivalenciaController extends AbstractController {

	@PreAuthorize("hasRole('EDEQUI')")
	@RequestMapping(method = RequestMethod.GET)
    public String obtenerTiposDeEquivalencia(Model model) {
		try 
		{
			BuscadorTipoEquivalenciaModel tipoEquivalenciaModel = new BuscadorTipoEquivalenciaModel();
			List<TipoEquivalencia> lista = tipoEquivalenciaModel.getTiposEquivalencia();
			
			model.addAttribute("tiposEquivalencia", lista);
			model.addAttribute("model", tipoEquivalenciaModel);

			if(lista.size() == 0)
				model.addAttribute("messageResult", "No se encontraron resultados para la b&uacute;squeda solicitada");
			
			return Page.BUSQUEDA_TIPO_EQUIVALENCIA;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_INIT;
		}
    }
	
	
	@PreAuthorize("hasRole('EDEQUI')")
	@RequestMapping(method = RequestMethod.POST)
    public String obtenerTiposDeEquivalencia(
    		@ModelAttribute("model") @Valid BuscadorTipoEquivalenciaModel tipoEquivalenciaModel, 
    		BindingResult result, 
    		Model model) 
	{
		try 
		{
			List<TipoEquivalencia> lista = tipoEquivalenciaModel.getTiposEquivalencia();
			
			model.addAttribute("tiposEquivalencia", lista);
			model.addAttribute("model", tipoEquivalenciaModel);

			if(lista.size() == 0)
				model.addAttribute("messageResult", "No se encontraron resultados para la b&uacute;squeda solicitada");
			
			return Page.BUSQUEDA_TIPO_EQUIVALENCIA;
		}
		catch(GalsException ex) {
			model.addAttribute("tiposEquivalencia", Arrays.asList());
			model.addAttribute("model", tipoEquivalenciaModel);
			model.addAttribute("errors", ex.getErrors());
			return Page.BUSQUEDA_TIPO_EQUIVALENCIA;
		}
    }
	
	
	@PreAuthorize("hasRole('EDEQUI')")
	@RequestMapping(value = "/Alta", method = RequestMethod.GET)
    public String altaTipoEquivalencia(Model model) {
		model.addAttribute("model", new TipoEquivalenciaModel());
		model.addAttribute("action", "A");
		return Page.EDICION_TIPO_EQUIVALENCIA;
    }
	
	
	@PreAuthorize("hasRole('EDEQUI')")
	@RequestMapping(value = "/Alta", method = RequestMethod.POST)
    public String altaTipoEquivalencia(
    		@ModelAttribute("model") @Valid TipoEquivalenciaModel tipoEquivalenciaModel, 
    		BindingResult result, 
    		Model model) 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", tipoEquivalenciaModel);
				model.addAttribute("action", "A");
				return Page.EDICION_TIPO_EQUIVALENCIA;
			}
			
			tipoEquivalenciaModel.crearTipoEquivalencia();
		}
		catch(GalsException ex) {
			model.addAttribute("model", tipoEquivalenciaModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "A");
			return Page.EDICION_TIPO_EQUIVALENCIA;
		}
		
		model.addAttribute("messageResult", "La equivalencia se creo exitosamente");
		return "redirect:" + Page.URL_EQUIVALENCIA;
    }

	
	@PreAuthorize("hasRole('EDEQUI')")
	@RequestMapping(value = "/Modificar/{tipoEquivalenciaId}", method = RequestMethod.GET)
    public String modificarTipoEquivalencia(@PathVariable("tipoEquivalenciaId") int tipoEquivalenciaId, Model model) {
		try 
		{
			model.addAttribute("model", new TipoEquivalenciaModel(tipoEquivalenciaId));
			model.addAttribute("action", "M");
			return Page.EDICION_TIPO_EQUIVALENCIA;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_EQUIVALENCIA;
		}
    }
	
	
	@PreAuthorize("hasRole('EDEQUI')")
	@RequestMapping(value = "/Modificar/{tipoEquivalenciaId}", method = RequestMethod.POST)
    public String modificarTipoEquivalencia(
    		@PathVariable("tipoEquivalenciaId") int tipoEquivalenciaId,
    		@ModelAttribute("model") @Valid TipoEquivalenciaModel tipoEquivalenciaModel, 
    		BindingResult result, 
    		Model model) 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", tipoEquivalenciaModel);
				model.addAttribute("action", "M");
				return Page.EDICION_TIPO_EQUIVALENCIA;
			}
	
			tipoEquivalenciaModel.modificarTipoEquivalencia(tipoEquivalenciaId);
		}
		catch(GalsException ex) {
			model.addAttribute("model", tipoEquivalenciaModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "M");
			return Page.EDICION_TIPO_EQUIVALENCIA;
		}		
		
		model.addAttribute("messageResult", "La equivalencia se modific&oacute; exitosamente");
		return "redirect:" + Page.URL_EQUIVALENCIA;
    }
	

	@PreAuthorize("hasRole('EDEQUI')")
	@RequestMapping(value = "/Eliminar/{tipoEquivalenciaId}", method = RequestMethod.GET)
    public String eliminarTipoEquivalencia(@PathVariable("tipoEquivalenciaId") int tipoEquivalenciaId, Model model) {
		try 
		{
			model.addAttribute("model", new TipoEquivalenciaModel(tipoEquivalenciaId));
			model.addAttribute("action", "B");
			return Page.EDICION_TIPO_EQUIVALENCIA;
		}
		catch(GalsException ex) {
			model.addAttribute("messageResult", ex.getErrors().get(0).getDescripcion());
			return "redirect:" + Page.URL_EQUIVALENCIA;
		}
    }
	
	
	@PreAuthorize("hasRole('EDEQUI')")
	@RequestMapping(value = "/Eliminar/{tipoEquivalenciaId}", method = RequestMethod.POST)
    public String eliminarTipoEquivalencia(
    		@PathVariable("tipoEquivalenciaId") int tipoEquivalenciaId,
    		@ModelAttribute("model") @Valid TipoEquivalenciaModel tipoEquivalenciaModel, 
    		BindingResult result, 
    		Model model) 
	{
		try 
		{
			if(result.hasErrors()) {
				model.addAttribute("model", tipoEquivalenciaModel);
				model.addAttribute("action", "B");
				return Page.EDICION_TIPO_EQUIVALENCIA;
			}
	
			tipoEquivalenciaModel.eliminarTipoEquivalencia(tipoEquivalenciaId);
		}
		catch(GalsException ex) {
			model.addAttribute("model", tipoEquivalenciaModel);
			model.addAttribute("errors", ex.getErrors());
			model.addAttribute("action", "B");
			return Page.EDICION_TIPO_EQUIVALENCIA;
		}

		model.addAttribute("messageResult", "La equivalencia se elimin&oacute; exitosamente");
		return "redirect:" + Page.URL_EQUIVALENCIA;
    }
}
